package com.example.demo.enums;

import java.util.concurrent.*;

/**
 * @program: yagena-portage
 * @description: 枚举多线程工具类
 * @author: yby
 * @create: 2020-06-20 16:39
 **/
public enum ThreadPoolEnum {

    INSTANCE;
    /**
     * 内部定义对象封装成私有的
     */
    private ThreadPoolExecutor threadPool;

    /**
     * 通过公共的静态方法对外界返回唯一的实例
     */
    public ThreadPoolExecutor getInstance(){
        return this.threadPool;
    }

    /**
     * 私有构造方法
     */
    ThreadPoolEnum() {
        // 根据cpu的数量动态的配置核心线程数和最大线程数
        int CPU_COUNT  = Runtime.getRuntime().availableProcessors() < 1 ? 16 : Runtime.getRuntime().availableProcessors();
        // 核心线程数 = CPU核心数 + 1
        int CORE_POOL_SIZE    = CPU_COUNT + 1;
        // 线程池最大线程数 = CPU核心数 * 2 + 1
        int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
        // 队列的长度
        int QUEUE_SIZE = CPU_COUNT * 20;
        // 非核心线程闲置时超时2s
        int KEEP_ALIVE = 2;
        this.threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS,
                new LinkedBlockingDeque<Runnable>(QUEUE_SIZE));
    }

    /**
     * 无返回值直接执行
     */
    public void execute(Runnable runnable){
        this.threadPool.execute(runnable);
    }

    /**
     * 返回值直接执行
     */
    public <T> Future<T> submit(Callable<T> callable){
        return this.threadPool.submit(callable);
    }


}
